home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_rand / std_rand.e < prev   
Text File  |  1998-12-22  |  2KB  |  96 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://www.loria.fr/SmallEiffel
  11. --
  12. class STD_RAND
  13.    -- Press' standard generator, which uses the minimal standard 
  14.    -- and then uses shuffling to break up short order corelations.
  15.    
  16. inherit
  17.    MIN_STAND
  18.       redefine with_seed, next
  19.       select with_seed, next
  20.       end;
  21.    MIN_STAND
  22.       rename
  23.      next as min_next
  24.       export
  25.      {NONE} min_next
  26.       redefine
  27.      last_integer, last_real
  28.       end;
  29.  
  30. creation make, with_seed
  31.  
  32. feature {NONE}
  33.    
  34.    iv: ARRAY[INTEGER];
  35.  
  36.    ntab: INTEGER is 32;
  37.  
  38.    iy: INTEGER;
  39.  
  40. feature {NONE}
  41.  
  42.    with_seed(seed_value:INTEGER) is
  43.       require
  44.      valid_seed: seed_value > 0 and seed_value < im
  45.       local
  46.      i: INTEGER;
  47.       do
  48.      seed := seed_value;
  49.      min_next;
  50.      !!iv.make(1,ntab);
  51.      from 
  52.         i := 1;
  53.      until 
  54.         i > 7
  55.      loop
  56.         min_next;
  57.         i := i + 1;
  58.      end;
  59.      from
  60.         i := ntab;
  61.      until
  62.         i = 0
  63.      loop
  64.         iv.put(seed,i);
  65.         min_next;
  66.         i := i - 1;
  67.      end
  68.      iy := iv.item(1);
  69.      next;
  70.       end
  71.  
  72. feature
  73.  
  74.    next is
  75.       local
  76.      tmp:INTEGER
  77.       do
  78.      tmp := iy \\ ntab + 1;
  79.      min_next;
  80.      iy := iv.item(tmp);
  81.      iv.put(seed,tmp);
  82.       end
  83.  
  84.    last_integer(n:INTEGER):INTEGER is
  85.       do
  86.      Result := iy \\ n + 1;
  87.       end
  88.  
  89.    last_real:REAL is
  90.       do
  91.      Result := (iy / im).to_real;
  92.       end
  93.  
  94. end -- STD_RAND
  95.  
  96.